#' 对结果进行meta分析
#'
#' @param res U5_mr产生的res, 注意！！ 进行meta的对象的名字（exposure 或者 outcome）应该是同名的，只有id不一样，
#' 不然就拆开了来分析就只有1行数据来meta了
#' @param effects 默认固定效应"FE"，随机效应可选择"DL"等，详见 metafor包的rma函数
#'
#' @return 添加了meta分析的结果
#' @export
#'
#' @examples
#'
#' \dontrun{
#'
#' meta_res <- U6_add_meta(res,effects = "FE")
#'
#' }
#'
#'
U6_add_meta <- function(res,effects = "FE"){


  if(!"metafor" %in% installed.packages() ){
    install.packages("metafor")
  }


 res_meta <- res %>%
      U6_res_to_TSMR_res() %>%
      split(list(.$exposure,.$outcome,.$method))


  res_meta <- Filter(function(x) {
    nrow(x) > 0
  }, res_meta)

  res_meta_all <- res_meta %>%
    furrr::future_map_dfr(add_meta,
                          effects=effects,
                          .options = furrr::furrr_options(seed = TRUE),
                          .progress = TRUE)

  res_meta_all <- TwoSampleMR::generate_odds_ratios(res_meta_all)


  res_meta_all$`Beta (95% CI)` <- ifelse(is.na(res_meta_all$b), NA,
                                   sprintf("%.3f (%.3f to %.3f)",
                                           res_meta_all$b, res_meta_all$lo_ci, res_meta_all$up_ci))


  res_meta_all$`OR (95% CI)` <- ifelse(is.na(res_meta_all$or), NA,
                                 sprintf("%.3f (%.3f to %.3f)",
                                         res_meta_all$or, res_meta_all$or_lci95, res_meta_all$or_uci95))



  return(res_meta_all)

}

add_meta <- function(temp,effects= "FE" ){

  if( all( is.na(temp$b ) ) ){

    metamod <- list(beta=NA,
                    se =NA,
                    pval =NA
    )

  }else{

    metamod <- metafor::rma(yi= b ,
                            sei= se,
                            data= temp,
                            method=effects)

    #β是回归系数的值，se是标准误，DL表示选择的是随机效应模型，固定效应模型是method="FE"

  }



  new <- data.frame( id.exposure= ifelse( length( unique(temp$id.exposure) ) ==1,unique(temp$id.exposure),"meta"     )   ,
                     id.outcome= ifelse( length( unique(temp$id.outcome) ) ==1,unique(temp$id.outcome),"meta"     ) ,
                     outcome= temp$outcome[1],
                     exposure= temp$exposure[1],
                     method= temp$method[1],
                     nsnp= NA,
                     b= metamod[["beta"]],
                     se= metamod[["se"]],
                     pval= metamod[["pval"]] )

  temp<- plyr::rbind.fill(temp,new)

  return(temp)

}
